#include <iostream>
#include <ostream>
struct ListNode {
    int val;
    ListNode *next;
    ListNode() : val(0), next(nullptr) {}
    ListNode(int x) : val(x), next(nullptr) {}
    ListNode(int x, ListNode *next) : val(x), next(next) {}
 };

// 删除链表 head 中值等于 val 的节点，并返回删除节点后的链表的头节点
ListNode* removeElements(ListNode* head, int val) {
    // 最小子问题
    if (head == nullptr) return nullptr;
    // 删除除了头节点的子链表中指定值的节点
    head->next = removeElements(head->next, val);
    // 处理头节点
    return head->val == val ? head->next : head;
}